/*
 * Player.h
 *
 *  Created on: 2010-05-27
 *      Author: mateusz
 */

#ifndef PLAYER_H_
#define PLAYER_H_

#include <ClanLib/core.h>
#include <ClanLib/display.h>

#include "Map.h"
#include "Bombs.h"
#include "Element.h"

/**
 * Klasa reprezentująca gracza
 */

class Player : public Element {
public:
	/**
	 * @param gc do rysowania
	 * @param resources grafika
	 * @param mapa
	 * @param zbiornik bomb
	 */
	Player(CL_GraphicContext &gc, CL_ResourceManager *resources, Map* map, Bombs *b);
	virtual ~Player();

	/**
	 * Rysuje gracza
	 * @param gc gdzie ma rysować
	 */
	void draw(CL_GraphicContext &gc);

	/**
	 * Przenosi gracza na nowe polozenie
	 */
	void move(double timePassed);

	/**
	 * Sprawdza czy gracz na znajduje sie na ogniu.
	 * Jeżeli tak to ginie
	 */
	void check();

	/**
	 * Podpięcie klawiatury
	 * @param window okno gry
	 */
	void attachKeyboard(CL_DisplayWindow *window);

	/**
	 * Zmartwychwstanie
	 */
	void resurrect() {
		alive = true;
	}

	/**
	 * Smierc
	 */
	void die() {
		alive = false;
	}

	/**
	 * Ustawia grafike gracza w zależnosci od id
	 * @param gc rysowanie
	 * @param resources plik z grafikami
	 * @param id id gracza
	 */
	void setImage(CL_GraphicContext &gc, CL_ResourceManager *resources, int id);

	/**
	 * Wraca na pozycje startowa w zależnosci od id
	 * @param id id gracza
	 */
	void goToStartPosition(int id);

	/**
	 * Sygnał zmiany położenia
	 */
	CL_Signal_v2<int, int>& getSignalPlayerMove() { return signalPlayerMove; }

	/**
	 * Sygnał podłóżenia bomby
	 */
	CL_Signal_v2<int, int>& getSignalBombPlanted() { return signalBombPlanted; }

	/**
	 * Sygnał smierci
	 */
	CL_Signal_v1<int>& getSignalDead() { return signalDead; }
private:
	void onKeyDown(const CL_InputEvent &key, const CL_InputState &state);

	CL_Sprite playerImage;

	int dx, dy;
	double speed;

	Map *map;
	Bombs *bombs;

	bool alive;

	CL_Signal_v2<int, int> signalPlayerMove;
	CL_Signal_v2<int, int> signalBombPlanted;
	CL_Signal_v1<int> signalDead;
	CL_SlotContainer slots;
};

#endif /* PLAYER_H_ */
